package fejezet20;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.JApplet;
import javax.swing.JPanel;
import javax.swing.Timer;

public class AnalógÓra extends JApplet
    implements ActionListener {
  private Timer időzítő=new Timer(0, this);
  private JPanel óraPanel=new JPanel();
  private final Dimension méret=new Dimension(300, 300);
  private final Point origó=new Point(150, 150);
  private Point óramutatóPont, percmutatóPont,
    másodpercmutatóPont;
  private int óra, perc, másodperc;
  private final int óramutatóHossz=90,
    percmutatóHossz=120, mpercmutatóHossz=150;

  @Override
  public void init() {
    setSize(méret.width+1, méret.height+1);
    óraPanel.setSize(méret);
  }

  @Override
  public void start() {
    időzítő.setDelay(1000);
    időzítő.start();
  }

  @Override
  public void stop() {
    időzítő.stop();
  }

  public void actionPerformed(ActionEvent e) {
    GregorianCalendar naptár=new GregorianCalendar();
    óra=naptár.get(Calendar.HOUR);
    perc=naptár.get(Calendar.MINUTE);
    másodperc=naptár.get(Calendar.SECOND);
    repaint();
  }

  @Override
  public void paint(Graphics g) {
    g.clearRect(0, 0, 300, 300+100);
    g.setColor(Color.DARK_GRAY);
    g.drawOval(0, 0, 300, 300);

    for(int i=1; i<=60; i++) {           //percek, ötpercek
      int hossz=(i%5==0)?15:5;
      Point p1=new Point(
        origó.x+(int)(cos(i*6-90)*(150-hossz)),
        origó.y+(int)(sin(i*6-90)*(150-hossz))
      );
      Point p2=new Point(
        origó.x+(int)(cos(i*6-90)*(150)),
        origó.y+(int)(sin(i*6-90)*(150))
      );
      drawLine(g, p1, p2);
    }

    g.setColor(Color.BLACK);
    másodpercmutatóPont=new Point(        //másodpercmutató
      origó.x+(int)(cos(másodperc*6-90)*mpercmutatóHossz),
      origó.y+(int)(sin(másodperc*6-90)*mpercmutatóHossz)
    );
    drawLine(g, origó, másodpercmutatóPont);

    percmutatóPont=new Point(                  //percmutató
      origó.x+(int)(cos(perc*6-90)*percmutatóHossz),
      origó.y+(int)(sin(perc*6-90)*percmutatóHossz)
    );
    drawLine(g, origó, percmutatóPont);

    óramutatóPont=new Point(                    //óramutató
      origó.x+(int)(cos(óra*30+perc/2-90)*óramutatóHossz),
      origó.y+(int)(sin(óra*30+perc/2-90)*óramutatóHossz)
    );
    drawLine(g, origó, óramutatóPont);
  }

  private double sin(double x) {
    return Math.sin(Math.toRadians(x));
  }

  private double cos(double x) {
    return Math.cos(Math.toRadians(x));
  }

  private void drawLine(Graphics g, Point p1, Point p2) {
    g.drawLine(p1.x, p1.y, p2.x, p2.y);
  }
}